package controle;

import excecao.DisciplinaPossuiTurmasException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.ListDataModel;
import modelo.Disciplina;
import service.DisciplinaService;
import util.FabricaDeObjetos;

/**
 *
 * @author SCHETTINO
 */
public class DisciplinaMB extends BaseMB {

    private DisciplinaService disciplinaService;
    private List<Disciplina> lista;
    private Disciplina disciplinaCorrente;
    private ListDataModel listaDataModel;

    public DisciplinaMB() {
        try {
            disciplinaService = (DisciplinaService) FabricaDeObjetos.getObjetoUnico(DisciplinaService.class);
        } catch (Exception ex) {
            Logger.getLogger(DisciplinaMB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String exibirTodas() {
        lista = disciplinaService.getTodos();
        listaDataModel = new ListDataModel(lista);
        
        return "disciplinaExibirTodas";
    }

    public String exibirTodasPorAluno() {
        lista = disciplinaService.getTodos();
        listaDataModel = new ListDataModel(lista);

        return "disciplinaExibirTodasPorAluno";
    }

    public String exibirTurmas() {
        disciplinaCorrente = (Disciplina) listaDataModel.getRowData();
        disciplinaCorrente = disciplinaService.getPorIdComTurmas(disciplinaCorrente.getId());

        listaDataModel = new ListDataModel(disciplinaCorrente.getTurmas());

        return "exibirTurmas";
    }

    public String buscar() {
        disciplinaCorrente = new Disciplina();

        return "buscarDisciplina";
    }

    public String buscaPorNome() {
        lista = disciplinaService.getPorNome(disciplinaCorrente.getNome());
        listaDataModel = new ListDataModel(lista);

        return "disciplinaExibirTodas";
    }

    public String buscaPorId() {
        disciplinaCorrente = disciplinaService.getPorId(disciplinaCorrente.getId());
        List listaDisciplina = new ArrayList();

        if (disciplinaCorrente != null) {
            listaDisciplina.add(disciplinaCorrente);
        }

        listaDataModel = new ListDataModel(listaDisciplina);

        return "disciplinaExibirTodas";
    }

    public String editar() {
        disciplinaCorrente = (Disciplina) listaDataModel.getRowData();

        return "editarDisciplina";
    }

    public String editarPelaBusca() {
        return "editarDisciplina";
    }

    //Método auxiliar
    private String excluir() {
        //Tenta remover a disciplina da lista de disciplinas
        try {
            disciplinaService.remover(disciplinaCorrente);
        } catch (DisciplinaPossuiTurmasException ex) {
            this.error(ex.getMessage());

            return "disciplinaNaoExcluida";
        }

        this.info("Disciplina excluida com sucesso!");

        return "disciplinaExcluida";
    }

    public String excluirPelaExibirTodas() {
        disciplinaCorrente = (Disciplina) listaDataModel.getRowData();

        return excluir();
    }

    public String excluirPelaBusca() {
        return excluir();
    }

    public String voltar() {
        disciplinaCorrente = new Disciplina();

        return "Voltar";
    }

    public String voltarBusca() {
        disciplinaCorrente = new Disciplina();

        return "disciplinaVoltarBusca";
    }

    public String cadastrar() {
        disciplinaCorrente = new Disciplina();

        return "cadastrarDisciplina";
    }

    public String salvar() {
        disciplinaService.inserir(disciplinaCorrente);

        return "disciplinaSalvar";
    }

    public String salvarEdicao() {
        //Tenta editar a disciplina
        try {
             disciplinaService.alterar(disciplinaCorrente);
        } catch (DisciplinaPossuiTurmasException ex) {
            this.error(ex.getMessage());

            return "disciplinaEdicaoNaoSalva";
        }
        
        this.info("Disciplina editada com sucesso!");

        return "disciplinaEdicaoSalva";
    }

    public DisciplinaService getDisciplinaService() {
        return disciplinaService;
    }

    public void setDisciplinaService(DisciplinaService disciplinaService) {
        this.disciplinaService = disciplinaService;
    }

    public Disciplina getDisciplinaCorrente() {
        return disciplinaCorrente;
    }

    public void setDisciplinaCorrente(Disciplina disciplinaCorrente) {
        this.disciplinaCorrente = disciplinaCorrente;
    }

    public List<Disciplina> getLista() {
        return lista;
    }

    public void setLista(List<Disciplina> lista) {
        this.lista = lista;
    }

    public ListDataModel getListaDataModel() {
        return listaDataModel;
    }

    public void setListaDataModel(ListDataModel listaDataModel) {
        this.listaDataModel = listaDataModel;
    }
}
